package cn.tedu.medicalmanagementsystem.user.service.impl;

import cn.tedu.medicalmanagementsystem.base.response.JsonResult;
import cn.tedu.medicalmanagementsystem.base.response.StatusCode;
import cn.tedu.medicalmanagementsystem.user.mapper.UserMapper;
import cn.tedu.medicalmanagementsystem.user.pojo.dto.UserUpdateParam;
import cn.tedu.medicalmanagementsystem.user.pojo.entity.User;
import cn.tedu.medicalmanagementsystem.user.service.UserService1;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
@Slf4j
public class UserServiceImpl implements UserService1 {
    @Autowired
    private UserMapper userMapper;

    @Override
    public JsonResult updateUser(UserUpdateParam userUpdateParam) {
        log.debug("开始处理修改个人信息请求，用户ID：{}，参数：{}", userUpdateParam.getUserId(), userUpdateParam);

        User currentUser = userMapper.selectById(userUpdateParam.getUserId());
        if (currentUser == null) {
            return new JsonResult(StatusCode.USER_NOT_EXIST);
        }

        // 检查手机号是否已被其他用户使用
        if (userUpdateParam.getPhone() != null &&
                !userUpdateParam.getPhone().equals(currentUser.getPhone())) {
            if (userMapper.phoneExists(userUpdateParam.getPhone()) > 0) {
                log.debug("手机号已存在！");
                return new JsonResult(StatusCode.PHONE_EXISTS);
            }
        }

        // 检查邮箱是否已被其他用户使用
        if (userUpdateParam.getEmail() != null &&
                !userUpdateParam.getEmail().equals(currentUser.getEmail())) {
            if (userMapper.emailExists(userUpdateParam.getEmail()) > 0) {
                log.debug("邮箱已存在！");
                return new JsonResult(StatusCode.EMAIL_EXISTS);
            }
        }

        // 更新用户信息
        User user = new User();
        BeanUtils.copyProperties(userUpdateParam, user);

        // 处理密码更新（如果提供了新密码）
        if (userUpdateParam.getPassword() != null && !userUpdateParam.getPassword().isEmpty()) {
            // 在实际项目中，这里应该对新密码进行加密处理
            user.setPassword(userUpdateParam.getPassword());
        } else {
            // 不更新密码
            user.setPassword(null);
        }

        try {
            int rows = userMapper.update(userUpdateParam);
            if (rows != 1) {
                log.error("更新用户信息失败，用户ID：{}", userUpdateParam.getUserId());
                return new JsonResult(StatusCode.OPERATION_FAILED);
            }
            log.info("用户信息更新成功，用户ID：{}", userUpdateParam.getUserId());
            return new JsonResult(StatusCode.OPERATION_SUCCESS);

        } catch (Exception e) {
            log.error("更新用户信息时发生异常，用户ID：{}，异常：{}", userUpdateParam.getUserId(), e.getMessage());
            return new JsonResult(StatusCode.OPERATION_FAILED);
        }
    }
}
